package top.roadvast.rabbitmq.consumer;

import com.rabbitmq.client.*;
import top.roadvast.rabbitmq.utils.RabbitmqUtil;

import java.io.IOException;
import java.nio.charset.StandardCharsets;
import java.util.concurrent.TimeoutException;

/**
 * @Author 郭泽鹏
 * @Date 2021/12/25 22:52
 * @Version 1.0
 * @Description rabbitmq的六种工作模式之一：简单模式
 */
public class SimpleConsumer {
    public static void main (String[] args) throws IOException, TimeoutException {
        //建立连接
        Connection connection = RabbitmqUtil.getConnection();
        //建立信道
        Channel ch = connection.createChannel();
        //声明队列,如果该队列已经创建过,则不会重复创建
        ch.queueDeclare("helloworld",false,false,false,null);
        System.out.println("等待接收数据...");

        //收到消息后用来处理消息的回调对象
        DeliverCallback deliverCallback = (consumerTag, message) -> {
            String msg = new String(message.getBody(), StandardCharsets.UTF_8);
            System.out.println("收到: "+msg);
        };

        //消费者取消时的回调对象
        CancelCallback cancelCallback = (consumerTag) -> {

        };

        /*
         * 启动一个消费者，并返回服务端生成的消费者标识
         * queue:队列名
         * autoAck：true 接收到传递过来的消息后acknowledged（应答服务器），false 接收到消息后不应答服务器
         * deliverCallback： 当一个消息发送过来后的回调接口
         * cancelCallback：当一个消费者取消订阅时的回调接口;取消消费者订阅队列时除了使用{@link Channel#basicCancel}之外的所有方式都会调用该回调方法
         * @return 服务端生成的消费者标识
         */
        ch.basicConsume("helloworld", true, deliverCallback, cancelCallback);
    }
}
